﻿using JX.Infrastructure.Common;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Globalization;
using System.Xml.Serialization;

namespace JX.Infrastructure.Field
{
	/// <summary>
	/// 字段信息的实体类
	/// </summary>
	[XmlRoot("FieldInfo")]
	public class FieldInfo
	{
		/// <summary>
		/// 表示空字段
		/// </summary>
		public static readonly FieldInfo NullFieldInfoOjbect = new NullFieldInfo();

		#region 属性
		/// <summary>
		/// 是否空对象
		/// </summary>
		[XmlIgnore]
		public bool IsNull { get; private set; }

		private string m_Id;
		/// <summary>
		/// ID
		/// </summary>
		[XmlAttribute("Id")]
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string Id
		{
			get
			{
				return m_Id;
			}
			set
			{
				m_Id = value.ToLower(CultureInfo.CurrentCulture);
			}
		}

		/// <summary>
		/// 字段名称
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		[Required(ErrorMessage = "字段名称不能为空")]
		[RegularExpression(RegexHelper.FieldNamePattern, ErrorMessage = "由字母、数字、下划线组成，并且仅能字母开头，不以下划线结尾")]
		public string FieldName { get; set; } = string.Empty;

		/// <summary>
		/// 字段别名
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		[Required(ErrorMessage = "字段别名不能为空")]
		public string FieldAlias { get; set; } = string.Empty;

		/// <summary>
		/// 字段等级：0：网站系统内置字段；1：客户自定义字段；
		/// </summary>
		public int FieldLevel { get; set; }

		/// <summary>
		/// 字段类型
		/// </summary>
		public FieldType FieldType { get; set; }

		/// <summary>
		/// 字段类型说明
		/// </summary>
		[XmlIgnore]
		public string FieldTypeText
		{
			get
			{
				return EnumHelper.GetDescription(FieldType);
			}
		}

		/// <summary>
		/// 字段默认值
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string DefaultValue { get; set; } = string.Empty;

		/// <summary>
		/// 字段提示
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string Tips { get; set; } = string.Empty;

		/// <summary>
		/// 字段描述
		/// </summary>
		[DisplayFormat(ConvertEmptyStringToNull = false)]
		public string Description { get; set; } = string.Empty;

		/// <summary>
		/// 是否禁用
		/// </summary>
		[XmlAttribute("Disabled")]
		public bool Disabled { get; set; }

		/// <summary>
		/// 是否允许字段有空值(是否必填)
		/// </summary>
		public bool EnableNull { get; set; }

		/// <summary>
		/// 是否在搜索表单显示
		/// </summary>
		public bool EnableShowOnSearchForm { get; set; }

		/// <summary>
		/// 排序ID
		/// </summary>
		[XmlAttribute("OrderId")]
		public int OrderId { get; set; }

		private Collection<string> m_Settings;
		/// <summary>
		/// 字段自定义属性集合。
		/// TextType：最大字符数、文本框长度、布尔值（默认FALSE）、输入法设置、是否启用站内链接功能、是否启用字符过滤功能、是否启用字符屏蔽功能、验证规则、验证错误提示。
		/// MultipleTextType：显示的宽度、显示的高度、是否启用站内链接功能、是否启用字符过滤功能、是否启用字符屏蔽功能。
		/// MultipleHtmlTextType：编辑器类型、显示的宽度、显示的高度、是否启用站内链接功能、是否启用字符过滤功能、是否启用字符屏蔽功能。
		/// ListBoxType：选项内容（显示数据|保存数据$$$显示数据|保存数据）、显示选项使用类型（1：单选下拉列表框；2：多选列表框；3：单选按钮；4：复选框；）、是否允许“填充” 选项、每行显示项数。
		/// ListBoxIntroType：选项内容（显示数据|保存数据$$$显示数据|保存数据）、显示选项使用类型（1：单选按钮；2：复选框；）、每行显示项数。
		/// ListBoxDataType：SQL查询语句、显示文本的字段名、数据保存字段名、数据保存字段类型、显示选项使用类型（1：单选下拉列表框；2：多选列表框；3：单选按钮；4：复选框；）、是否显示“请选择”选项、每行显示项数。
		/// IntegerType：最小值、最大值、是否以百分比显示。
		/// NumberType：最小值、最大值、小数位数、是否以百分比显示。
		/// MoneyType：最小值、最大值。
		/// DateTimeType：日期格式（year,month,date,time,datetime）、日期默认值类型（0：无；1：当前日期；2：指定日期；）、是否开启区域选择。
		/// LookType：获取信息来自模型、在此模型对应信息表的字段。
		/// LinkType：文本框长度、最大字符数。
		/// BoolType：选择“是”的文本、选择“否”的文本。
		/// PictureType：图片文本框长度、允许的图片大小、允许的图片类型、是否从系统已上传图片中选择、图片是否加水印、是否上传缩略图、是否启用上传、是否从信息已上传图片中选择、上传文件名保存规则。
		/// FileType：允许的文件大小、允许的文件类型、是否为下载频道控件、是否保存文件大小、保存字段的名称、上传文件名保存规则、地址前缀、上传文件最大数量。
		/// InfoType：显示的宽度、显示的高度。
		/// AuthorType：文本框长度、是否保存上次记录、模型ID。
		/// SourceType：文本框长度、是否保存上次记录、模型ID。
		/// KeywordType：文本框长度、是否保存上次记录、模型ID。
		/// OperatingType：选项内容（多个值之间用“$$$”分隔）、文本框长度、是否保存上次记录、模型ID。
		/// DownServerType：文本框长度、是否保存上次记录、模型ID。
		/// SpecialType：显示的宽度、显示的高度。
		/// Producer：文本框长度、是否保存上次记录、模型ID。
		/// Trademark：文本框长度、是否保存上次记录、模型ID。
		/// ContentType：显示的宽度、显示的高度、允许上传的图片类型、允许上传的媒体类型、允许上传的附件类型、图片是否加水印、是否上传缩略图、允许的文件大小、上传文件名保存规则。
		/// TitleType：最大字符数、文本框长度、是否启用检测重复值、是否自动生成字母标题。
		/// MultiplePhotoType：允许的文件大小、允许的文件类型、图片是否加水印、上传文件名保存规则。
		/// Property：使用的值，多个值之间用“|”分隔。
		/// ProductStyle：使用的值，多个值之间用“|”分隔。
		/// SelectUser：文本框长度、是否保存上次记录、模型ID。
		/// RegionType：排列方式、显示方式、显示方式默认设置、是否必填。
		/// RegionTypeFive：排列方式、显示方式、显示方式默认设置。
		/// RegionTypeText：排列方式、显示方式、显示方式默认设置。
		/// RegionTypeSelect：行政区划默认设置。
		/// IndustryCategory：根节点ID。
		/// </summary>
		public Collection<string> Settings 
		{
			get
			{
				return this.m_Settings;
			}
		}
		#endregion

		/// <summary>
		/// 构造:初始化设置集
		/// </summary>
		public FieldInfo()
		{
			if (m_Settings == null)
			{
				m_Settings = new Collection<string>();
			}
			IsNull = false;
			m_Settings.Clear();
		}

		/// <summary>
		///  拷贝设置
		/// </summary>
		/// <param name="settings"></param>
		public void CopyToSettings(Collection<string> settings)
		{
			m_Settings = settings;
		}

		/// <summary>
		/// 表示空字段实体类
		/// </summary>
		private class NullFieldInfo : FieldInfo
		{
			internal NullFieldInfo()
			{
				base.IsNull = true;
			}
		}
	}
}
